#include "Types.h"

namespace Util
{

template<class T>
BoolVar<T>::BoolVar()
{
    bValue_ = false;
}

template<class T>
BoolVar<T>::BoolVar(const T& bValue)
{
    bValue_ = bValue;
}

template<class T>
bool BoolVar<T>::operator ! () const
{
    return !bValue_;
}

template<class T>
BoolVar<T>::operator MemberFn() const
{
    if (bValue_)
        return &BoolVar::Get;
    else
        return NULL;
}

template<class T>
BoolVar<T> BoolVar<T>::operator == (const BoolVar& bValue) const
{
    return (bValue_ == bValue.bValue_);
}

template<class T>
BoolVar<T> BoolVar<T>::operator != (const BoolVar& bValue) const
{
    return (bValue_ != bValue.bValue_);
}

template<class T>
BoolVar<T>& BoolVar<T>::operator =  (const BoolVar& bValue)
{
    bValue_ = bValue.bValue_;
    return *this;
}

/// Returns a random boolean.
/** \return Either 'true' or 'false' (50% each).
*/
template<class T>
BoolVar<T> BoolVar<T>::Random()
{
    return (rand()/(RAND_MAX+1.0) < 0.5f);
}

template<class T>
const string_element* BoolVar<T>::BOOL_TRUE = "true";
template<class T>
const string_element* BoolVar<T>::BOOL_ONE  = "1";
template<class T>
const string_element* BoolVar<T>::BOOL_YES  = "yes";

template class BoolVar<bool>;

}
